package com.android.recorder01;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
 
public class DrawView extends View {
    	
		private Context context;
    	private Paint   mPaint;
        private Bitmap  mBitmap;
        private Canvas  mCanvas;
        private Path    mPath;
        private Paint   mBitmapPaint;
        //private ArrayList<Path> paths = new ArrayList<Path>();  
        
        public DrawView(Context context) 
        {
            super(context);
            init(context);   
        }

        public DrawView(Context context, AttributeSet attrs)
        {
            super(context, attrs);
            init(context);
        }

        public DrawView(Context context, AttributeSet attrs, int defStyle) 
        {
            super(context, attrs, defStyle);
            init(context);
        }
    	
    	private void init(Context context) {
    	    this.context = context;
    	    setFocusable(true);
    	    setFocusableInTouchMode(true);

    	    mPaint = new Paint();
    	    mPaint.setAntiAlias(true);
    	    mPaint.setDither(true);
    	    mPaint.setColor(Color.BLACK);
    	    mPaint.setStyle(Paint.Style.STROKE);
    	    mPaint.setStrokeJoin(Paint.Join.ROUND);
    	    mPaint.setStrokeCap(Paint.Cap.ROUND);
    	    mPaint.setStrokeWidth(6);
    	    //mCanvas = new Canvas();
    	    mPath = new Path();
    	   //paths.add(mPath);
    	    
            mBitmapPaint = new Paint(Paint.DITHER_FLAG);
    	}
    	
        @Override
        protected void onSizeChanged(int w, int h, int oldw, int oldh) {
            super.onSizeChanged(w, h, oldw, oldh);
            mBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
            mCanvas = new Canvas(mBitmap);
        }
 
        @Override
        protected void onDraw(Canvas canvas) {
            canvas.drawColor(Color.WHITE);
 
            canvas.drawBitmap(mBitmap, 0, 0, mBitmapPaint);
 
            canvas.drawPath(mPath, mPaint);
        }
 
        private float mX, mY;
        private static final float TOUCH_TOLERANCE = 4;
 
        private void touch_start(float x, float y) {
            mPath.reset();
            mPath.moveTo(x, y);
            mX = x;
            mY = y;
        }
        private void touch_move(float x, float y) {
            float dx = Math.abs(x - mX);
            float dy = Math.abs(y - mY);
            if (dx >= TOUCH_TOLERANCE || dy >= TOUCH_TOLERANCE) {
                mPath.quadTo(mX, mY, (x + mX)/2, (y + mY)/2);
                mX = x;
                mY = y;
            }
        }
        private void touch_up() {
            mPath.lineTo(mX, mY);
            // commit the path to our offscreen
            mCanvas.drawPath(mPath, mPaint);
            // kill this so we don't double draw
            mPath.reset();
        }
 
        @Override
        public boolean onTouchEvent(MotionEvent event) {
            float x = event.getX();
            float y = event.getY();
 
            switch (event.getAction()) {
                case MotionEvent.ACTION_DOWN:
                    touch_start(x, y);
                    invalidate();
                    break;
                case MotionEvent.ACTION_MOVE:
                    touch_move(x, y);
                    invalidate();
                    break;
                case MotionEvent.ACTION_UP:
                    touch_up();
                    invalidate();
                    break;
            }
            return true;
        }
}